package com.itzhouwei.commerce.thread.core.demo3;

/**
 * @description:守护线程操作
 * @author：zw，微信公共号：yingshengzw
 * @date: 2021/8/28
 * @Copyright：公众号：搬砖暗夜码农 | 博客：https://itzhouwei.com - 沉淀、学习、分享、成长，让自己和他人都能有所收获！
 */
public class DaemonThreadDemo {

    public static void main(String[] args) {
        /**
         * 不加守护线程操作 结果如下
         * zw = [Ljava.lang.String;@e44640b
         * zw = [Ljava.lang.String;@e44640b
         * zw = [Ljava.lang.String;@e44640b
         * zw = [Ljava.lang.String;@e44640b
         * zw = [Ljava.lang.String;@e44640b
         * zw = [Ljava.lang.String;@e44640b
         * zw exit runing
         */
//        Runtime.getRuntime().addShutdownHook(new Thread(()->System.err.println("zw exit runing")));
//        Thread thread = new Thread(() -> {
//            while (true){
//                try {
//                    Thread.sleep(3000);
//                    System.err.println("zw = " + args);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }
//        });
//        thread.start();



        // 守护线程测试结果如下 zw exit runing  通过以上的测试发现 守护线程具有在jvm 退出的时候也自我销毁的特点
        //而非守护线程不具备这个特点 这也是为什么GC 回收线程被设置守护线程类型的主要原因

        Runtime.getRuntime().addShutdownHook(new Thread(()->System.err.println("zw exit runing")));
        Thread thread = new Thread(() -> {
            while (true){
                try {
                    Thread.sleep(3000);
                    System.err.println("zw = " + args);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.setDaemon(true);//开启守护线程
        thread.start();
    }



}
